/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/include/agvNavigate/helpInc/force_relocate.h
 * @Description  : 该文件定义了ForceRelocate类及其相关功能，用于处理重定位过程中的状态管理和触发机制。 
 *                 包含重定位阶段的枚举类型RelocateStage，以及重定位所需的各种方法。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 16:44:31
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/ 
#pragma once

#include "rclcpp/rclcpp.hpp"
#include "timestamp.h"

enum class RelocateStage {
    RelocateUnknown, // 重定位未知
    RelocateNo,      // 不需要重定位
    RelocateWait,    // 重定位等待中
    RelocateFinish   // 重定位完成
};
//   The class  of class "ForceRelocate".
class ForceRelocate
{
public:
    // The destructor
    ForceRelocate();
    ~ForceRelocate() = default;

    bool WaitRelocateFinish(uint16_t time_diff);
    void Ready();
    void Reset();

    // 强制重定位全局变量: /forceRelocate
    // int 类型
    // 0:激光不重定位  1++:激光重定位
    // 使用方法：非0时，数值变化，重定位一次
    bool RelocateTrigOnce();
    void SetNextTrajFind(bool find);
    bool NextTrajFind() const;
    void SetStage(RelocateStage stage);
    RelocateStage GetStage() const;
private:
    int Trigger();
private:
    RelocateStage stage_;
    bool find_next_ = false;
    bool running_ = false;
    int trig_id_ = 0;
    int last_trig_id_ = 0;
    TimerTriggerOnce trig_;
};
